﻿#nullable disable
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;

namespace TodoApi.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class ClassesController : ControllerBase
    {
        private readonly StudentContext _context;

        public ClassesController(StudentContext context)
        {
            _context = context;
        }

        // GET: api/Classes
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Classes>>> GetClasses(int start,int length,bool sort,string search)
        {
            //先获取一下数据
            List<Classes> Classess = await _context.Classes.ToListAsync();
            //简单的写一下
            //如果有搜索的话那就搜一下
            if(search !=null)
            {
                Classess = Classess.Where(x => x.Name.Contains(search)).ToList();
            }
            //简单的排下序,就按名字吧,可以继续添加参数来
            if(sort)
            {
                Classess = Classess.OrderBy(x => x.Name).ToList();
            }
            //如果设置了长度的话那就这样咯
            if(length > 0)
            {
                Classess = Classess.Skip(start).Take(length).ToList();
            }
            return Classess;
        }

        // GET: api/Classes/5
        [HttpGet("{id}")]
        public async Task<ActionResult<Classes>> GetClasses(Guid id)
        {
            var Classes = await _context.Classes.FindAsync(id);

            if (Classes == null)
            {
                return NotFound();
            }

            return Classes;
        }

        // PUT: api/Classes/5
        // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
        [HttpPut("{id}")]
        public async Task<IActionResult> PutClasses(Guid id, Classes Classes)
        {
            if (id != Classes.Id)
            {
                return BadRequest();
            }

            _context.Entry(Classes).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ClassesExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return NoContent();
        }

        // POST: api/Classes
        // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
        [HttpPost]
        //public async Task<ActionResult<Classes>> PostClasses(Classes Classes)
        //{
        //    //当传入的对象没有id时就是一串长长的0了，就自己创建了一个，实现添加的操作了
        //    if (Classes.Id == Guid.Parse("00000000-0000-0000-0000-000000000000"))
        //    {
        //        //创建一个ID
        //        Classes.Id = Guid.NewGuid();
        //        //把要添加的实体数据放入Add中，这仅仅跟踪这条数据而没有对数据库进行操作
        //        _context.Classes.Add(Classes);
        //    }
        //    else
        //    {
        //        //如果输入了Id的话判断下是不是指定输入id的
        //        Classes todo = await _context.Classes.FindAsync(Classes.Id);
        //        //没找到这个Id的话那就是添加咯
        //        if(todo==null)
        //        {
        //            _context.Classes.Add(Classes);

        //        }
        //        else
        //        {
        //            //有这个ID那就是更新了
        //            _context.Update(Classes);
        //        }
        //    }
        //    //这个方法就是把上下文中的所有更改保存到数据库中了
        //    await _context.SaveChangesAsync();
        //    //给GetClasses这个方法传个Id来查找然后返回
        //    return CreatedAtAction("GetClasses", new { id = Classes.Id }, Classes);
        //}



        public async Task<ActionResult<Classes>> PostClasses(Classes Classes)
        {
            //当传入的对象没有id时就是一串长长的0了，就自己创建了一个，实现添加的操作了
            if (Classes.Id == Guid.Parse("00000000-0000-0000-0000-000000000000"))
            {
                Classes.Id = Guid.NewGuid();
                //把要添加的实体数据放入Add中，这仅仅跟踪这条数据而没有对数据库进行操作
                _context.Classes.Add(Classes);
                
            }
            else
            {
                //否则的话就对这条数据进行更新了咯
                _context.Update(Classes);
            }
            //这个方法就是把上下文中的所有更改保存到数据库中了
            await _context.SaveChangesAsync();
            //给GetClasses这个方法传个Id来查找然后返回
            return CreatedAtAction("GetClasses", new { id = Classes.Id }, Classes);
        }
        [HttpPost("test")]
        public async Task<ActionResult<Classes>> test(Classes Classes)
        {
            _context.Classes.Add(Classes);
            await _context.SaveChangesAsync();

            //return CreatedAtAction("GetClasses", new { id = Classes.Id }, Classes);
            return CreatedAtAction(nameof(GetClasses), new { id = Classes.Id }, Classes);
        }

        // DELETE: api/Classes/5
        [HttpDelete("{id}")]
        public async Task<IActionResult> DeleteClasses(Guid id)
        {
            //查找这个id的实体
            var Classes = await _context.Classes.FindAsync(id);
            //避免出错就判断一下
            if (Classes == null)
            {
                return NotFound();
            }
            //这里需要放入实体数据进去跟踪所以上面就查找了咯
            //_context.Classes.Remove(Classes);
            //常规的保存哈
            await _context.SaveChangesAsync();

            return NoContent();
        }

        private bool ClassesExists(Guid id)
        {
            return _context.Classes.Any(e => e.Id == id);
        }
    }
}
